<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>01、Git | 小阳爱技术</title>
    <meta name="generator" content="VuePress 1.9.5">
    <link rel="icon" href="/img/favicon.ico">
    <link rel="icon" href="/favicon.ico">
    <link rel="manifest" href="/manifest.json">
    <meta name="description" content="Python, Linux, Nginx, Django, Flask, WEB, 前端, Java 全栈知识体系, java体系, java知识体系, java框架,java详解,java学习路线,java spring, java面试, 知识体系, java技术体系, java编程, java编程指南,java开发体系, java开发,java教程,java,java数据结构, 算法, 开发基础">
    <meta name="keywords" content="Python, Linux, Nginx, Django, Flask, WEB, 前端, Java 全栈知识体系, java体系, java知识体系, java框架,java详解,java学习路线,java spring, java面试, 知识体系, java技术体系, java编程, java编程指南,java开发体系, java开发,java教程,java,java数据结构, 算法, 开发基础">
    <meta name="theme-color" content="#11a8cd">
    <meta name="robots" content="all">
    <meta name="author" content="小阳爱技术">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    
    <link rel="preload" href="/assets/css/0.styles.8cb71cba.css" as="style"><link rel="preload" href="/assets/js/app.9f33dad1.js" as="script"><link rel="preload" href="/assets/js/2.336839c5.js" as="script"><link rel="preload" href="/assets/js/25.7b40ded3.js" as="script"><link rel="prefetch" href="/assets/js/10.78490e0e.js"><link rel="prefetch" href="/assets/js/11.358c0655.js"><link rel="prefetch" href="/assets/js/12.3d907ab6.js"><link rel="prefetch" href="/assets/js/13.e005782a.js"><link rel="prefetch" href="/assets/js/14.5c1831ed.js"><link rel="prefetch" href="/assets/js/15.3dae17f7.js"><link rel="prefetch" href="/assets/js/16.caf002bb.js"><link rel="prefetch" href="/assets/js/17.96d97c18.js"><link rel="prefetch" href="/assets/js/18.6f49a065.js"><link rel="prefetch" href="/assets/js/19.a72a1b44.js"><link rel="prefetch" href="/assets/js/20.5dbbd998.js"><link rel="prefetch" href="/assets/js/21.3b5c9825.js"><link rel="prefetch" href="/assets/js/22.588d1d79.js"><link rel="prefetch" href="/assets/js/23.bb2ba1d1.js"><link rel="prefetch" href="/assets/js/24.2036f1ef.js"><link rel="prefetch" href="/assets/js/26.51a93ad7.js"><link rel="prefetch" href="/assets/js/27.23a56743.js"><link rel="prefetch" href="/assets/js/28.2bfb83a2.js"><link rel="prefetch" href="/assets/js/29.b8c6cf94.js"><link rel="prefetch" href="/assets/js/3.00f81f09.js"><link rel="prefetch" href="/assets/js/30.fe19a5d5.js"><link rel="prefetch" href="/assets/js/31.b68040bb.js"><link rel="prefetch" href="/assets/js/32.d9d3dba8.js"><link rel="prefetch" href="/assets/js/33.59561c54.js"><link rel="prefetch" href="/assets/js/34.243786a2.js"><link rel="prefetch" href="/assets/js/35.daf1b05e.js"><link rel="prefetch" href="/assets/js/36.13258281.js"><link rel="prefetch" href="/assets/js/37.4b591e31.js"><link rel="prefetch" href="/assets/js/38.13d6ce06.js"><link rel="prefetch" href="/assets/js/39.c51dd517.js"><link rel="prefetch" href="/assets/js/4.72262f85.js"><link rel="prefetch" href="/assets/js/40.227cf12d.js"><link rel="prefetch" href="/assets/js/41.8ada8611.js"><link rel="prefetch" href="/assets/js/42.b168f326.js"><link rel="prefetch" href="/assets/js/43.9df968fc.js"><link rel="prefetch" href="/assets/js/44.1546c9b1.js"><link rel="prefetch" href="/assets/js/45.c29bc1da.js"><link rel="prefetch" href="/assets/js/46.2de30989.js"><link rel="prefetch" href="/assets/js/47.34b5ca9a.js"><link rel="prefetch" href="/assets/js/5.56d0fbc7.js"><link rel="prefetch" href="/assets/js/6.b9ff2c2e.js"><link rel="prefetch" href="/assets/js/7.41c828d4.js"><link rel="prefetch" href="/assets/js/8.82412463.js"><link rel="prefetch" href="/assets/js/9.c499cdfa.js">
    <link rel="stylesheet" href="/assets/css/0.styles.8cb71cba.css">
  </head>
  <body class="theme-mode-light">
    <div id="app" data-server-rendered="true"><div class="theme-container sidebar-open have-rightmenu"><header class="navbar blur"><div title="目录" class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><img src="/img/logo.png" alt="小阳爱技术" class="logo"> <span class="site-name can-hide">小阳爱技术</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link">首页</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Python" class="dropdown-title"><a href="/python" class="link-title">Python</a> <span class="title" style="display:none;">Python</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/30f9ff/404" class="nav-link">暂无</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="DevOPs" class="dropdown-title"><a href="/devops/" class="link-title">DevOPs</a> <span class="title" style="display:none;">DevOPs</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>Git</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Git核心命令</a></li></ul></li><li class="dropdown-item"><h4>GitLab</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Gitlab基础</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">CI/CD语法</a></li></ul></li><li class="dropdown-item"><h4>Jernkins</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Jenkins入门</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Pipeline流水线语法</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Jenkins集成各种工具</a></li></ul></li><li class="dropdown-item"><h4>企业级流水线案例</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">企业级流水线的两个场景</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Npm企业流水线案例</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Java企业级流水线案例</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Python企业级流水线案例</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Golang企业级流水线案例</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><a href="/more/" class="link-title">更多</a> <span class="title" style="display:none;">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/f2a556/" class="nav-link">学习</a></li><li class="dropdown-item"><!----> <a href="/pages/aea6571b7a8bae86/" class="nav-link">面试</a></li><li class="dropdown-item"><!----> <a href="/pages/2d615df9a36a98ed/" class="nav-link">心情杂货</a></li><li class="dropdown-item"><!----> <a href="/pages/baaa02/" class="nav-link">实用技巧</a></li></ul></div></div><div class="nav-item"><a href="/about/" class="nav-link">关于</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="收藏" class="dropdown-title"><a href="/pages/beb6c0bd8a66cea6/" class="link-title">收藏</a> <span class="title" style="display:none;">收藏</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/beb6c0bd8a66cea6/" class="nav-link">网站</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="索引" class="dropdown-title"><a href="/archives/" class="link-title">索引</a> <span class="title" style="display:none;">索引</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/categories/" class="nav-link">分类</a></li><li class="dropdown-item"><!----> <a href="/tags/" class="nav-link">标签</a></li><li class="dropdown-item"><!----> <a href="/archives/" class="nav-link">归档</a></li></ul></div></div> <a href="https://github.com//" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar-hover-trigger"></div> <aside class="sidebar" style="display:none;"><div class="blogger"><img src="/img/logo.png"> <div class="blogger-info"><h3>小阳爱技术</h3> <span>数据库管理员 &amp;&amp; 容器云狂热分子</span></div></div> <nav class="nav-links"><div class="nav-item"><a href="/" class="nav-link">首页</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Python" class="dropdown-title"><a href="/python" class="link-title">Python</a> <span class="title" style="display:none;">Python</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/30f9ff/404" class="nav-link">暂无</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="DevOPs" class="dropdown-title"><a href="/devops/" class="link-title">DevOPs</a> <span class="title" style="display:none;">DevOPs</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>Git</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Git核心命令</a></li></ul></li><li class="dropdown-item"><h4>GitLab</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Gitlab基础</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">CI/CD语法</a></li></ul></li><li class="dropdown-item"><h4>Jernkins</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Jenkins入门</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Pipeline流水线语法</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Jenkins集成各种工具</a></li></ul></li><li class="dropdown-item"><h4>企业级流水线案例</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">企业级流水线的两个场景</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Npm企业流水线案例</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Java企业级流水线案例</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Python企业级流水线案例</a></li><li class="dropdown-subitem"><a href="/pages/8143cc480faf9a11/" class="nav-link">Golang企业级流水线案例</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><a href="/more/" class="link-title">更多</a> <span class="title" style="display:none;">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/f2a556/" class="nav-link">学习</a></li><li class="dropdown-item"><!----> <a href="/pages/aea6571b7a8bae86/" class="nav-link">面试</a></li><li class="dropdown-item"><!----> <a href="/pages/2d615df9a36a98ed/" class="nav-link">心情杂货</a></li><li class="dropdown-item"><!----> <a href="/pages/baaa02/" class="nav-link">实用技巧</a></li></ul></div></div><div class="nav-item"><a href="/about/" class="nav-link">关于</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="收藏" class="dropdown-title"><a href="/pages/beb6c0bd8a66cea6/" class="link-title">收藏</a> <span class="title" style="display:none;">收藏</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/beb6c0bd8a66cea6/" class="nav-link">网站</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="索引" class="dropdown-title"><a href="/archives/" class="link-title">索引</a> <span class="title" style="display:none;">索引</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/categories/" class="nav-link">分类</a></li><li class="dropdown-item"><!----> <a href="/tags/" class="nav-link">标签</a></li><li class="dropdown-item"><!----> <a href="/archives/" class="nav-link">归档</a></li></ul></div></div> <a href="https://github.com//" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav>  <ul class="sidebar-links"><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>git</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/pages/30f9ff/" aria-current="page" class="active sidebar-link">01、Git</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level2"><a href="/pages/30f9ff/#git" class="sidebar-link">Git</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#git是什么" class="sidebar-link">Git是什么？</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#三种状态" class="sidebar-link">三种状态</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#安装git" class="sidebar-link">安装Git</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#linux操作系统上安装git" class="sidebar-link">Linux操作系统上安装Git</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#mac操作系统上安装git" class="sidebar-link">Mac操作系统上安装Git</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#windows操作系统上安装git" class="sidebar-link">Windows操作系统上安装Git</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#初次运行-git-前的配置" class="sidebar-link">初次运行 Git 前的配置</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#检查配置信息" class="sidebar-link">检查配置信息</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#git仓库" class="sidebar-link">Git仓库</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#在已存在目录中初始化仓库" class="sidebar-link">在已存在目录中初始化仓库</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#克隆现有的仓库" class="sidebar-link">克隆现有的仓库</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/30f9ff/#git基础" class="sidebar-link">Git基础</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#检查当前文件状态" class="sidebar-link">检查当前文件状态</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#跟踪新文件" class="sidebar-link">跟踪新文件</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#暂存已修改的文件" class="sidebar-link">暂存已修改的文件</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#状态简览" class="sidebar-link">状态简览</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#忽略文件" class="sidebar-link">忽略文件</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#提交更新" class="sidebar-link">提交更新</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#跳过使用暂存区域" class="sidebar-link">跳过使用暂存区域</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#移除文件" class="sidebar-link">移除文件</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#查看提交历史" class="sidebar-link">查看提交历史</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#撤消操作" class="sidebar-link">撤消操作</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#取消暂存的文件" class="sidebar-link">取消暂存的文件</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#撤消对文件的修改" class="sidebar-link">撤消对文件的修改</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#远程仓库的使用" class="sidebar-link">远程仓库的使用</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#查看远程仓库" class="sidebar-link">查看远程仓库</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#添加远程仓库" class="sidebar-link">添加远程仓库</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#从远程仓库中抓取与拉取" class="sidebar-link">从远程仓库中抓取与拉取</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#推送到远程仓库" class="sidebar-link">推送到远程仓库</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#查看某个远程仓库" class="sidebar-link">查看某个远程仓库</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#远程仓库的重命名与移除" class="sidebar-link">远程仓库的重命名与移除</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#打标签" class="sidebar-link">打标签</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#列出标签" class="sidebar-link">列出标签</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#创建标签" class="sidebar-link">创建标签</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#附注标签" class="sidebar-link">附注标签</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#轻量标签" class="sidebar-link">轻量标签</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/30f9ff/#git分支" class="sidebar-link">Git分支</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#分支创建" class="sidebar-link">分支创建</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#分支切换" class="sidebar-link">分支切换</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#分支的新建与合并" class="sidebar-link">分支的新建与合并</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#遇到冲突时的分支合并" class="sidebar-link">遇到冲突时的分支合并</a></li><li class="sidebar-sub-header level3"><a href="/pages/30f9ff/#远程分支" class="sidebar-link">远程分支</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#获取远程分支" class="sidebar-link">获取远程分支</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#推送" class="sidebar-link">推送</a></li><li class="sidebar-sub-header level4"><a href="/pages/30f9ff/#删除远程分支" class="sidebar-link">删除远程分支</a></li></ul></li></ul></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>gitlab</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>jenkins</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>企业级流水线</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>自动化测试流水线</span> <span class="arrow right"></span></p> <!----></section></li></ul> </aside> <div><main class="page"><div class="theme-vdoing-wrapper "><div class="articleInfo-wrap" data-v-06225672><div class="articleInfo" data-v-06225672><ul class="breadcrumbs" data-v-06225672><li data-v-06225672><a href="/" title="首页" class="iconfont icon-home router-link-active" data-v-06225672></a></li> <li data-v-06225672><a href="/categories/?category=DevOps" title="分类" data-v-06225672>DevOps</a></li><li data-v-06225672><a href="/categories/?category=git" title="分类" data-v-06225672>git</a></li></ul> <div class="info" data-v-06225672><div title="作者" class="author iconfont icon-touxiang" data-v-06225672><a href="https://blog.abck8s.com" target="_blank" title="作者" class="beLink" data-v-06225672>小阳爱技术</a></div> <div title="创建时间" class="date iconfont icon-riqi" data-v-06225672><a href="javascript:;" data-v-06225672>2022-06-22</a></div> <!----></div></div></div> <!----> <div class="content-wrapper"><div class="right-menu-wrapper"><div class="right-menu-margin"><div class="right-menu-title">目录</div> <div class="right-menu-content"></div></div></div> <h1><img src="">01、Git<!----></h1>  <div class="theme-vdoing-content content__default"><h1 id="devops入门到企业级流水线维护-git"><a href="#devops入门到企业级流水线维护-git" class="header-anchor">#</a> DevOps入门到企业级流水线维护(GIT)</h1> <p>我们学习 DevOps 或者敏捷开发最主要的原因就是因为 DevOps 能够增加我们在开发过程中多个部门之间的配合，提高整个团队之间的工作效率。</p> <p><img src="/img/devops-lifecycle.svg" alt="img"></p> <p>我们用一句话来简单理解一下：就是将开发写好的代码，自动部署到需要部署的服务器上。</p> <p><img src="/img/image-20220618130754798.png" alt="image-20220618130754798"></p> <h2 id="git"><a href="#git" class="header-anchor">#</a> Git</h2> <p>在了解DevOps之前，我们先了解一下版本控制系统。</p> <p>所谓的版本控制系统，用一句话来讲，就是用来记录一个或若干文件内容变化，以便将来查阅特定版本修订情况的系统。</p> <p>同生活中的许多伟大事物一样，Git 诞生于一个极富纷争大举创新的年代。</p> <p>Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上（1991－2002年间）。 到 2002 年，整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。</p> <p>到了 2005 年，开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束，他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区（特别是 Linux 的缔造者 Linus Torvalds）基于使用 BitKeeper 时的经验教训，开发出自己的版本系统。 他们对新的系统制订了若干目标：</p> <ul><li>速度</li> <li>简单的设计</li> <li>对非线性开发模式的强力支持（允许成千上万个并行开发的分支）</li> <li>完全分布式</li> <li>有能力高效管理类似 Linux 内核一样的超大规模项目（速度和数据量）</li></ul> <p>自诞生于 2005 年以来，Git 日臻成熟完善，在高度易用的同时，仍然保留着初期设定的目标。 它的速度飞快，极其适合管理大项目，有着令人难以置信的非线性分支管理系统。</p> <h3 id="git是什么"><a href="#git是什么" class="header-anchor">#</a> Git是什么？</h3> <p>如果我们要学习好GIT，首先需要理解好Git对待文件的方式。传统的文件版本控制系统对待数据的方式是以文件变更列表的方式存储信息；而Git 更像是把数据看作是对小型文件系统的一系列快照。</p> <p>在 Git 中，每当你提交更新或保存项目状态时，它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率，如果文件没有修改，Git 不再重新存储该文件，而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 <strong>快照流</strong>。</p> <h3 id="三种状态"><a href="#三种状态" class="header-anchor">#</a> 三种状态</h3> <p>现在请注意，如果你希望后面的学习更顺利，请记住下面这些关于 Git 的概念。 Git 有三种状态，你的文件可能处于其中之一： <strong>已提交（committed）</strong>、<strong>已修改（modified）</strong> 和 <strong>已暂存（staged）</strong>。</p> <ul><li>已修改表示修改了文件，但还没保存到数据库中。</li> <li>已暂存表示对一个已修改文件的当前版本做了标记，使之包含在下次提交的快照中。</li> <li>已提交表示数据已经安全地保存在本地数据库中。</li></ul> <p>这会让我们的 Git 项目拥有三个阶段：工作区、暂存区以及 Git 目录。</p> <p><img src="/img/areas.png" alt="工作区、暂存区以及 Git 目录。"></p> <p>基本的 Git 工作流程如下：</p> <ol><li>在工作区中修改文件。</li> <li>将你想要下次提交的更改选择性地暂存，这样只会将更改的部分添加到暂存区。</li> <li>提交更新，找到暂存区的文件，将快照永久性存储到 Git 目录。</li></ol> <h3 id="安装git"><a href="#安装git" class="header-anchor">#</a> 安装Git</h3> <p>因为Git是一个跨平台是分布式文件管理系统，所以git是可以运行在各个平台上的，下面我们就分别在各个平台上安装一下Git。</p> <h4 id="linux操作系统上安装git"><a href="#linux操作系统上安装git" class="header-anchor">#</a> Linux操作系统上安装Git</h4> <p>如果你想在 Linux 上用二进制安装程序来安装基本的 Git 工具，可以使用发行版包含的基础软件包管理工具来安装。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">sudo</span> yum <span class="token function">install</span> <span class="token function">git</span> -y
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h4 id="mac操作系统上安装git"><a href="#mac操作系统上安装git" class="header-anchor">#</a> Mac操作系统上安装Git</h4> <p>在 Mac 上安装 Git 有多种方式。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>brew <span class="token function">install</span> <span class="token function">git</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h4 id="windows操作系统上安装git"><a href="#windows操作系统上安装git" class="header-anchor">#</a> Windows操作系统上安装Git</h4> <p>在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开 https://git-scm.com/download/win，下载会自动开始。</p> <p><img src="/img/image-20220618140154859.png" alt="image-20220618140154859"></p> <h3 id="初次运行-git-前的配置"><a href="#初次运行-git-前的配置" class="header-anchor">#</a> 初次运行 Git 前的配置</h3> <p>安装完 Git 之后，要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要，因为每一个 Git 提交都会使用这些信息，它们会写入到你的每一次提交中，不可更改：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> config --global user.name <span class="token string">&quot;小阳爱技术&quot;</span>
$ <span class="token function">git</span> config --global user.email xiaoyangaijishue@example.com
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="检查配置信息"><a href="#检查配置信息" class="header-anchor">#</a> 检查配置信息</h3> <p>如果想要检查你的配置，可以使用 <code>git config --list</code> 命令来列出所有 Git 当时能找到的配置。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token punctuation">[</span>root@gitlab ~<span class="token punctuation">]</span><span class="token comment"># git config --list</span>
user.name<span class="token operator">=</span>小阳爱技术
user.email<span class="token operator">=</span>xiaoyangaijishue@example.com
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h3 id="git仓库"><a href="#git仓库" class="header-anchor">#</a> Git仓库</h3> <p>通常有两种获取 Git 项目仓库的方式：</p> <ol><li>将尚未进行版本控制的本地目录转换为 Git 仓库；</li> <li>从其它服务器 <strong>克隆</strong> 一个已存在的 Git 仓库。</li></ol> <p>两种方式都会在你的本地机器上得到一个工作就绪的 Git 仓库。</p> <h4 id="在已存在目录中初始化仓库"><a href="#在已存在目录中初始化仓库" class="header-anchor">#</a> 在已存在目录中初始化仓库</h4> <p>如果你有一个尚未进行版本控制的项目目录，想要用 Git 来控制它，那么首先需要进入该项目目录中。 如果你还没这样做过，那么不同系统上的做法有些不同：</p> <p>在 Linux 上：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token builtin class-name">cd</span> /home/user/my_project
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>在 macOS 上：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token builtin class-name">cd</span> /Users/user/my_project
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>在 Windows 上：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token builtin class-name">cd</span> /c/user/my_project
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>之后执行：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> init
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>该命令将创建一个名为 <code>.git</code> 的子目录，这个子目录含有你初始化的 Git 仓库中所有的必须文件，这些文件是 Git 仓库的骨干。 但是，在这个时候，我们仅仅是做了一个初始化的操作，你的项目里的文件还没有被跟踪。</p> <p>如果在一个已存在文件的文件夹（而非空文件夹）中进行版本控制，你应该开始追踪这些文件并进行初始提交。 可以通过 <code>git add</code> 命令来指定所需的文件来进行追踪，然后执行 <code>git commit</code> ：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> <span class="token function">add</span> *.c
$ <span class="token function">git</span> <span class="token function">add</span> LICENSE
$ <span class="token function">git</span> commit -m <span class="token string">'initial project version'</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>稍后我们再逐一解释这些指令的行为。 现在，你已经得到了一个存在被追踪文件与初始提交的 Git 仓库。</p> <h4 id="克隆现有的仓库"><a href="#克隆现有的仓库" class="header-anchor">#</a> 克隆现有的仓库</h4> <p>如果你想获得一份已经存在了的 Git 仓库的拷贝，比如说，你想为某个开源项目贡献自己的一份力，这时就要用到 <code>git clone</code> 命令。</p> <p>克隆仓库的命令是 <code>git clone &lt;url&gt;</code> 。 比如，要克隆 Git 的链接库 <code>devops</code>，可以用下面的命令：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> clone git@github.com:yangyang0910/devops.git
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>如果你想在克隆远程仓库的时候，自定义本地仓库的名字，你可以通过额外的参数指定新的目录名：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> clone git@github.com:yangyang0910/devops.git xiaoyangaijishu
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>这会执行与上一条命令相同的操作，但目标目录名变为了 <code>xiaoyangaijishu</code>。</p> <h2 id="git基础"><a href="#git基础" class="header-anchor">#</a> Git基础</h2> <p>你工作目录下的每一个文件都不外乎这两种状态：<strong>已跟踪</strong> 或 <strong>未跟踪</strong>。 已跟踪的文件是指那些被纳入了版本控制的文件，在上一次快照中有它们的记录，在工作一段时间后， 它们的状态可能是未修改，已修改或已放入暂存区。简而言之，已跟踪的文件就是 Git 已经知道的文件。</p> <p>工作目录中除已跟踪文件外的其它所有文件都属于未跟踪文件，它们既不存在于上次快照的记录中，也没有被放入暂存区。 初次克隆某个仓库的时候，工作目录中的所有文件都属于已跟踪文件，并处于未修改状态，因为 Git 刚刚检出了它们， 而你尚未编辑过它们。</p> <p>编辑过某些文件之后，由于自上次提交后你对它们做了修改，Git 将它们标记为已修改文件。 在工作时，你可以选择性地将这些修改过的文件放入暂存区，然后提交所有已暂存的修改，如此反复。</p> <h3 id="检查当前文件状态"><a href="#检查当前文件状态" class="header-anchor">#</a> 检查当前文件状态</h3> <p>可以用 <code>git status</code> 命令查看哪些文件处于什么状态。 如果在克隆仓库后立即使用此命令，会看到类似这样的输出：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
nothing to commit, working directory clean
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>现在，让我们在项目下创建一个新的 <code>README</code> 文件。 如果之前并不存在这个文件，使用 <code>git status</code> 命令，你将看到一个新的未跟踪文件：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token builtin class-name">echo</span> <span class="token string">'小样爱技术'</span> <span class="token operator">&gt;</span> README
$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
Untracked files:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git add &lt;file&gt;...&quot;</span> to include <span class="token keyword">in</span> what will be committed<span class="token punctuation">)</span>

    README

nothing added to commit but untracked files present <span class="token punctuation">(</span>use <span class="token string">&quot;git add&quot;</span> to track<span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><p>在状态报告中可以看到新建的 <code>README</code> 文件出现在 <code>Untracked files</code> 下面。 未跟踪的文件意味着 Git 在之前的快照（提交）中没有这些文件；Git 不会自动将之纳入跟踪范围，除非你明明白白地告诉它“我需要跟踪该文件”。 这样的处理让你不必担心将生成的二进制文件或其它不想被跟踪的文件包含进来。 不过现在的例子中，我们确实想要跟踪管理 <code>README</code> 这个文件。</p> <h3 id="跟踪新文件"><a href="#跟踪新文件" class="header-anchor">#</a> 跟踪新文件</h3> <p>使用命令 <code>git add</code> 开始跟踪一个文件。 所以，要跟踪 <code>README</code> 文件，运行：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> <span class="token function">add</span> README
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>此时再运行 <code>git status</code> 命令，会看到 <code>README</code> 文件已被跟踪，并处于暂存状态：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
Changes to be committed:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git restore --staged &lt;file&gt;...&quot;</span> to unstage<span class="token punctuation">)</span>

    new file:   README
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>只要在 <code>Changes to be committed</code> 这行下面的，就说明是已暂存状态。 如果此时提交，那么该文件在你运行 <code>git add</code> 时的版本将被留存在后续的历史记录中。 你可能会想起之前我们使用 <code>git init</code> 后就运行了 <code>git add &lt;files&gt;</code> 命令，开始跟踪当前目录下的文件。 <code>git add</code> 命令使用文件或目录的路径作为参数；如果参数是目录的路径，该命令将递归地跟踪该目录下的所有文件。</p> <h3 id="暂存已修改的文件"><a href="#暂存已修改的文件" class="header-anchor">#</a> 暂存已修改的文件</h3> <p>现在我们来修改一个已被跟踪的文件。 如果你修改了一个名为 <code>CONTRIBUTING.md</code> 的已被跟踪的文件，然后运行 <code>git status</code> 命令，会看到下面内容：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">mv</span> README.md CONTRIBUTING.md
$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
Changes to be committed:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git reset HEAD &lt;file&gt;...&quot;</span> to unstage<span class="token punctuation">)</span>

    new file:   README

Changes not staged <span class="token keyword">for</span> commit:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git add &lt;file&gt;...&quot;</span> to update what will be committed<span class="token punctuation">)</span>
  <span class="token punctuation">(</span>use <span class="token string">&quot;git checkout -- &lt;file&gt;...&quot;</span> to discard changes <span class="token keyword">in</span> working directory<span class="token punctuation">)</span>

    modified:   CONTRIBUTING.md
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p>文件 <code>CONTRIBUTING.md</code> 出现在 <code>Changes not staged for commit</code> 这行下面，说明已跟踪文件的内容发生了变化，但还没有放到暂存区。 要暂存这次更新，需要运行 <code>git add</code> 命令。这是个多功能命令：可以用它开始跟踪新文件，或者把已跟踪的文件放到暂存区，还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“精确地将内容添加到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。现在让我们运行 <code>git add</code> 将“CONTRIBUTING.md”放到暂存区，然后再看看 <code>git status</code> 的输出：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> <span class="token function">add</span> CONTRIBUTING.md
$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
Changes to be committed:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git reset HEAD &lt;file&gt;...&quot;</span> to unstage<span class="token punctuation">)</span>

    new file:   README
    modified:   CONTRIBUTING.md
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>现在两个文件都已暂存，下次提交时就会一并记录到仓库。 假设此时，你想要在 <code>CONTRIBUTING.md</code> 里再加条注释。 重新编辑存盘后，准备好提交。 不过且慢，再运行 <code>git status</code> 看看：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">vim</span> CONTRIBUTING.md
$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
Changes to be committed:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git reset HEAD &lt;file&gt;...&quot;</span> to unstage<span class="token punctuation">)</span>

    new file:   README
    modified:   CONTRIBUTING.md

Changes not staged <span class="token keyword">for</span> commit:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git add &lt;file&gt;...&quot;</span> to update what will be committed<span class="token punctuation">)</span>
  <span class="token punctuation">(</span>use <span class="token string">&quot;git checkout -- &lt;file&gt;...&quot;</span> to discard changes <span class="token keyword">in</span> working directory<span class="token punctuation">)</span>

    modified:   CONTRIBUTING.md
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><p>怎么回事？ 现在 <code>CONTRIBUTING.md</code> 文件同时出现在暂存区和非暂存区。 这怎么可能呢？ 好吧，实际上 Git 只不过暂存了你运行 <code>git add</code> 命令时的版本。 如果你现在提交，<code>CONTRIBUTING.md</code> 的版本是你最后一次运行 <code>git add</code> 命令时的那个版本，而不是你运行 <code>git commit</code> 时，在工作目录中的当前版本。 所以，运行了 <code>git add</code> 之后又作了修订的文件，需要重新运行 <code>git add</code> 把最新版本重新暂存起来：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> <span class="token function">add</span> CONTRIBUTING.md
$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
Changes to be committed:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git reset HEAD &lt;file&gt;...&quot;</span> to unstage<span class="token punctuation">)</span>

    new file:   README
    modified:   CONTRIBUTING.md
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><h3 id="状态简览"><a href="#状态简览" class="header-anchor">#</a> 状态简览</h3> <p><code>git status</code> 命令的输出十分详细，但其用语有些繁琐。 Git 有一个选项可以帮你缩短状态命令的输出，这样可以以简洁的方式查看更改。 如果你使用 <code>git status -s</code> 命令或 <code>git status --short</code> 命令，你将得到一种格式更为紧凑的输出。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><ul><li>新添加的未跟踪文件前面有 <code>??</code> 标记。</li> <li>新添加到暂存区中的文件前面有 <code>A</code> 标记。</li> <li>修改过的文件前面有 <code>M</code> 标记。</li> <li>输出中有两栏，左栏指明了暂存区的状态，右栏指明了工作区的状态。
<ul><li><code>README</code> 文件在工作区已修改但尚未暂存，</li> <li><code>lib/simplegit.rb</code> 文件已修改且已暂存</li> <li><code>Rakefile</code> 文件已修改，暂存后又作了修改，因此该文件的修改中既有已暂存的部分，又有未暂存的部分。</li></ul></li></ul> <h3 id="忽略文件"><a href="#忽略文件" class="header-anchor">#</a> 忽略文件</h3> <p>一般我们总会有些文件无需纳入 Git 的管理，也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件，比如日志文件，或者编译过程中创建的临时文件等。 在这种情况下，我们可以创建一个名为 <code>.gitignore</code> 的文件，列出要忽略的文件的模式。 来看一个实际的 <code>.gitignore</code> 例子：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">cat</span> .gitignore
*.<span class="token punctuation">[</span>oa<span class="token punctuation">]</span>
*~
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>第一行告诉 Git 忽略所有以 <code>.o</code> 或 <code>.a</code> 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。 第二行告诉 Git 忽略所有名字以波浪符（~）结尾的文件，许多文本编辑软件（比如 Emacs）都用这样的文件名保存副本。 此外，你可能还需要忽略 log，tmp 或者 pid 目录，以及自动生成的文档等等。 要养成一开始就为你的新仓库设置好 .gitignore 文件的习惯，以免将来误提交这类无用的文件。</p> <p>文件 <code>.gitignore</code> 的格式规范如下：</p> <ul><li>所有空行或者以 <code>#</code> 开头的行都会被 Git 忽略。</li> <li>可以使用标准的 glob 模式匹配，它会递归地应用在整个工作区中。</li> <li>匹配模式可以以（<code>/</code>）开头防止递归。</li> <li>匹配模式可以以（<code>/</code>）结尾指定目录。</li> <li>要忽略指定模式以外的文件或目录，可以在模式前加上叹号（<code>!</code>）取反。</li></ul> <p>所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号（<code>*</code>）匹配零个或多个任意字符；<code>[abc]</code> 匹配任何一个列在方括号中的字符 （这个例子要么匹配一个 a，要么匹配一个 b，要么匹配一个 c）； 问号（<code>?</code>）只匹配一个任意字符；如果在方括号中使用短划线分隔两个字符， 表示所有在这两个字符范围内的都可以匹配（比如 <code>[0-9]</code> 表示匹配所有 0 到 9 的数字）。 使用两个星号（<code>**</code>）表示匹配任意中间目录，比如 <code>a/**/z</code> 可以匹配 <code>a/z</code> 、 <code>a/b/z</code> 或 <code>a/b/c/z</code> 等。</p> <p>我们再看一个 <code>.gitignore</code> 文件的例子：</p> <div class="language- line-numbers-mode"><pre class="language-text"><code># 忽略所有的 .a 文件
*.a

# 但跟踪所有的 lib.a，即便你在前面忽略了 .a 文件
!lib.a

# 只忽略当前目录下的 TODO 文件，而不忽略 subdir/TODO
/TODO

# 忽略任何目录下名为 build 的文件夹
build/

# 忽略 doc/notes.txt，但不忽略 doc/server/arch.txt
doc/*.txt

# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><h3 id="提交更新"><a href="#提交更新" class="header-anchor">#</a> 提交更新</h3> <p>现在的暂存区已经准备就绪，可以提交了。 在此之前，请务必确认还有什么已修改或新建的文件还没有 <code>git add</code> 过， 否则提交的时候不会记录这些尚未暂存的变化。 这些已修改但未暂存的文件只会保留在本地磁盘。 所以，每次准备提交前，先用 <code>git status</code> 看下，你所需要的文件是不是都已暂存起来了， 然后再运行提交命令 <code>git commit</code>：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> commit
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>这样会启动你选择的文本编辑器来输入提交说明。</p> <p>编辑器会显示类似下面的文本信息（本例选用 Vim 的屏显方式展示）：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token comment"># Please enter the commit message for your changes. Lines starting</span>
<span class="token comment"># with '#' will be ignored, and an empty message aborts the commit.</span>
<span class="token comment"># On branch master</span>
<span class="token comment"># Your branch is up-to-date with 'origin/master'.</span>
<span class="token comment">#</span>
<span class="token comment"># Changes to be committed:</span>
<span class="token comment">#	new file:   README</span>
<span class="token comment">#	modified:   CONTRIBUTING.md</span>
<span class="token comment">#</span>
~
~
~
<span class="token string">&quot;.git/COMMIT_EDITMSG&quot;</span> 9L, 283C
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><p>可以看到，默认的提交消息包含最后一次运行 <code>git status</code> 的输出，放在注释行里，另外开头还有一个空行，供你输入提交说明。 你完全可以去掉这些注释行，不过留着也没关系，多少能帮你回想起这次更新的内容有哪些。</p> <p>退出编辑器时，Git 会丢弃注释行，用你输入的提交说明生成一次提交。</p> <p>另外，你也可以在 <code>commit</code> 命令后添加 <code>-m</code> 选项，将提交信息与命令放在同一行，如下所示：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> commit -m <span class="token string">&quot;Story 182: Fix benchmarks for speed&quot;</span>
<span class="token punctuation">[</span>master 463dc4f<span class="token punctuation">]</span> Story <span class="token number">182</span>: Fix benchmarks <span class="token keyword">for</span> speed
 <span class="token number">2</span> files changed, <span class="token number">2</span> insertions<span class="token punctuation">(</span>+<span class="token punctuation">)</span>
 create mode <span class="token number">100644</span> README
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>好，现在你已经创建了第一个提交！ 可以看到，提交后它会告诉你，当前是在哪个分支（<code>master</code>）提交的，本次提交的完整 SHA-1 校验和是什么（<code>463dc4f</code>），以及在本次提交中，有多少文件修订过，多少行添加和删改过。</p> <h3 id="跳过使用暂存区域"><a href="#跳过使用暂存区域" class="header-anchor">#</a> 跳过使用暂存区域</h3> <p>尽管使用暂存区域的方式可以精心准备要提交的细节，但有时候这么做略显繁琐。 Git 提供了一个跳过使用暂存区域的方式， 只要在提交的时候，给 <code>git commit</code> 加上 <code>-a</code> 选项，Git 就会自动把所有已经跟踪过的文件暂存起来一并提交，从而跳过 <code>git add</code> 步骤：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
Changes not staged <span class="token keyword">for</span> commit:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git add &lt;file&gt;...&quot;</span> to update what will be committed<span class="token punctuation">)</span>
  <span class="token punctuation">(</span>use <span class="token string">&quot;git checkout -- &lt;file&gt;...&quot;</span> to discard changes <span class="token keyword">in</span> working directory<span class="token punctuation">)</span>

    modified:   CONTRIBUTING.md

no changes added to commit <span class="token punctuation">(</span>use <span class="token string">&quot;git add&quot;</span> and/or <span class="token string">&quot;git commit -a&quot;</span><span class="token punctuation">)</span>
$ <span class="token function">git</span> commit -a -m <span class="token string">'added new benchmarks'</span>
<span class="token punctuation">[</span>master 83e38c7<span class="token punctuation">]</span> added new benchmarks
 <span class="token number">1</span> <span class="token function">file</span> changed, <span class="token number">5</span> insertions<span class="token punctuation">(</span>+<span class="token punctuation">)</span>, <span class="token number">0</span> deletions<span class="token punctuation">(</span>-<span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><p>看到了吗？提交之前不再需要 <code>git add</code> 文件“CONTRIBUTING.md”了。 这是因为 <code>-a</code> 选项使本次提交包含了所有修改过的文件。 这很方便，但是要小心，有时这个选项会将不需要的文件添加到提交中。</p> <h3 id="移除文件"><a href="#移除文件" class="header-anchor">#</a> 移除文件</h3> <p>要从 Git 中移除某个文件，就必须要从已跟踪文件清单中移除（确切地说，是从暂存区域移除），然后提交。 可以用 <code>git rm</code> 命令完成此项工作，并连带从工作目录中删除指定的文件，这样以后就不会出现在未跟踪文件清单中了。</p> <p>如果只是简单地从工作目录中手工删除文件，运行 <code>git status</code> 时就会在 “Changes not staged for commit” 部分（也就是 <em>未暂存清单</em>）看到：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">rm</span> PROJECTS.md
$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
Changes not staged <span class="token keyword">for</span> commit:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git add/rm &lt;file&gt;...&quot;</span> to update what will be committed<span class="token punctuation">)</span>
  <span class="token punctuation">(</span>use <span class="token string">&quot;git checkout -- &lt;file&gt;...&quot;</span> to discard changes <span class="token keyword">in</span> working directory<span class="token punctuation">)</span>

        deleted:    PROJECTS.md

no changes added to commit <span class="token punctuation">(</span>use <span class="token string">&quot;git add&quot;</span> and/or <span class="token string">&quot;git commit -a&quot;</span><span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><p>然后再运行 <code>git rm</code> 记录此次移除文件的操作：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> <span class="token function">rm</span> -f PROJECTS.md
<span class="token function">rm</span> <span class="token string">'PROJECTS.md'</span>
$ <span class="token function">git</span> status
On branch master
Your branch is up-to-date with <span class="token string">'origin/master'</span><span class="token builtin class-name">.</span>
Changes to be committed:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git reset HEAD &lt;file&gt;...&quot;</span> to unstage<span class="token punctuation">)</span>

    deleted:    PROJECTS.md
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>下一次提交时，该文件就不再纳入版本管理了。 如果要删除之前修改过或已经放到暂存区的文件，则必须使用强制删除选项 <code>-f</code>（译注：即 force 的首字母）。 这是一种安全特性，用于防止误删尚未添加到快照的数据，这样的数据不能被 Git 恢复。</p> <p>另外一种情况是，我们想把文件从 Git 仓库中删除（亦即从暂存区域移除），但仍然希望保留在当前工作目录中。 换句话说，你想让文件保留在磁盘，但是并不想让 Git 继续跟踪。 当你忘记添加 <code>.gitignore</code> 文件，不小心把一个很大的日志文件或一堆 <code>.a</code> 这样的编译生成文件添加到暂存区时，这一做法尤其有用。 为达到这一目的，使用 <code>--cached</code> 选项：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> <span class="token function">rm</span> --cached README
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p><code>git rm</code> 命令后面可以列出文件或者目录的名字，也可以使用 <code>glob</code> 模式。比如：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> <span class="token function">rm</span> log/<span class="token punctuation">\</span>*.log
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>注意到星号 <code>*</code> 之前的反斜杠 <code>\</code>， 因为 Git 有它自己的文件模式扩展匹配方式，所以我们不用 shell 来帮忙展开。 此命令删除 <code>log/</code> 目录下扩展名为 <code>.log</code> 的所有文件。 类似的比如：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> <span class="token function">rm</span> <span class="token punctuation">\</span>*~
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>该命令会删除所有名字以 <code>~</code> 结尾的文件。</p> <h3 id="查看提交历史"><a href="#查看提交历史" class="header-anchor">#</a> 查看提交历史</h3> <p>在提交了若干更新，又或者克隆了某个项目之后，你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 <code>git log</code> 命令。</p> <p>我们使用一个非常简单的 “simplegit” 项目作为示例。 运行下面的命令获取该项目：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> clone git@github.com:yangyang0910/code6.git
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>当你在此项目中运行 <code>git log</code> 命令时，可以看到下面的输出：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> log
commit ebee69797eefeebeb2e075cee4f1cbe766e52d87
Author: 小阳爱技术 <span class="token operator">&lt;</span>xxxxxxxxxxx@qq.com<span class="token operator">&gt;</span>
Date:   Wed Jun <span class="token number">15</span> <span class="token number">16</span>:10:23 <span class="token number">2022</span> +0800

    其他：version <span class="token number">1.6</span>.0

commit 0bbfcc8c397ba0fa7157a7b495844b53f09d6358
Author: 小阳爱技术 <span class="token operator">&lt;</span>xxxxxxxxxxx@qq.com<span class="token operator">&gt;</span>
Date:   Wed Jun <span class="token number">15</span> <span class="token number">16</span>:09:48 <span class="token number">2022</span> +0800

    修复：企业微信消息推送文档变更
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>不传入任何参数的默认情况下，<code>git log</code> 会按时间先后顺序列出所有的提交，最近的更新排在最上面。 正如你所看到的，这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。</p> <p><code>git log</code> 有许多选项可以帮助你搜寻你所要找的提交， 下面我们会介绍几个最常用的选项。</p> <p>其中一个比较有用的选项是 <code>-p</code> 或 <code>--patch</code> ，它会显示每次提交所引入的差异（按 <strong>补丁</strong> 的格式输出）。 你也可以限制显示的日志条目数量，例如使用 <code>-2</code> 选项来只显示最近的两次提交：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> log -p -2
commit ebee69797eefeebeb2e075cee4f1cbe766e52d87
Author: 小阳爱技术 <span class="token operator">&lt;</span>小阳爱技术@qq.com<span class="token operator">&gt;</span>
Date:   Wed Jun <span class="token number">15</span> <span class="token number">16</span>:10:23 <span class="token number">2022</span> +0800

    其他：version <span class="token number">1.6</span>.0

<span class="token function">diff</span> --git a/version b/version
index f01291b<span class="token punctuation">..</span>dc1e644 <span class="token number">100644</span>
--- a/version
+++ b/version
@@ -1 +1 @@
-1.5.7
+1.6.0

commit 0bbfcc8c397ba0fa7157a7b495844b53f09d6358
Author: 小阳爱技术 <span class="token operator">&lt;</span>小阳爱技术@qq.com<span class="token operator">&gt;</span>
Date:   Wed Jun <span class="token number">15</span> <span class="token number">16</span>:09:48 <span class="token number">2022</span> +0800

    修复：企业微信消息推送文档变更

<span class="token function">diff</span> --git a/resources/views/configNotify/index.blade.php b/resources/views/configNotify/index.blade.php
index cd96185<span class="token punctuation">..</span>f68cc2c <span class="token number">100644</span>
--- a/resources/views/configNotify/index.blade.php
+++ b/resources/views/configNotify/index.blade.php
@@ -225,7 +225,7 @@
                     type: <span class="token string">'help'</span>,
                     tooltip: <span class="token string">'企业微信文档'</span>,
                     handler: <span class="token function-name function">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
-                        tool.winOpen<span class="token punctuation">(</span><span class="token string">'https://work.weixin.qq.com/api/doc/90000/90136/91770'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
+                        tool.winOpen<span class="token punctuation">(</span><span class="token string">'https://developer.work.weixin.qq.com/document/path/90372'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                     <span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br></div></div><p>另一个非常有用的选项是 <code>--pretty</code>。 这个选项可以使用不同于默认格式的方式展示提交历史。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> log --pretty<span class="token operator">=</span>oneline
ebee69797eefeebeb2e075cee4f1cbe766e52d87 其他：version <span class="token number">1.6</span>.0
0bbfcc8c397ba0fa7157a7b495844b53f09d6358 修复：企业微信消息推送文档变更
5d971596b13f1cc14c44b01788d7d96aa50a8efe 优化：docker-compose 部署优化
1b8f10d772f42344d3b01f5e79b96742fdbcbe00 优化：docker-compose 部署优化
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>最有意思的是 <code>format</code> ，可以定制记录的显示格式。 这样的输出对后期提取分析格外有用——因为你知道输出的格式不会随着 Git 的更新而发生改变：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> log --pretty<span class="token operator">=</span>format:<span class="token string">&quot;%h - %an, %ar : %s&quot;</span>
ebee697 - 小阳爱技术, <span class="token number">3</span> days ago <span class="token builtin class-name">:</span> 其他：version <span class="token number">1.6</span>.0
0bbfcc8 - 小阳爱技术, <span class="token number">3</span> days ago <span class="token builtin class-name">:</span> 修复：企业微信消息推送文档变更
5d97159 - 小阳爱技术, <span class="token number">3</span> days ago <span class="token builtin class-name">:</span> 优化：docker-compose 部署优化
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p><code>git log --pretty=format</code> 常用的选项：</p> <table><thead><tr><th style="text-align:left;">选项</th> <th style="text-align:left;">说明</th></tr></thead> <tbody><tr><td style="text-align:left;"><code>%H</code></td> <td style="text-align:left;">提交的完整哈希值</td></tr> <tr><td style="text-align:left;"><code>%h</code></td> <td style="text-align:left;">提交的简写哈希值</td></tr> <tr><td style="text-align:left;"><code>%T</code></td> <td style="text-align:left;">树的完整哈希值</td></tr> <tr><td style="text-align:left;"><code>%t</code></td> <td style="text-align:left;">树的简写哈希值</td></tr> <tr><td style="text-align:left;"><code>%P</code></td> <td style="text-align:left;">父提交的完整哈希值</td></tr> <tr><td style="text-align:left;"><code>%p</code></td> <td style="text-align:left;">父提交的简写哈希值</td></tr> <tr><td style="text-align:left;"><code>%an</code></td> <td style="text-align:left;">作者名字</td></tr> <tr><td style="text-align:left;"><code>%ae</code></td> <td style="text-align:left;">作者的电子邮件地址</td></tr> <tr><td style="text-align:left;"><code>%ad</code></td> <td style="text-align:left;">作者修订日期（可以用 --date=选项 来定制格式）</td></tr> <tr><td style="text-align:left;"><code>%ar</code></td> <td style="text-align:left;">作者修订日期，按多久以前的方式显示</td></tr> <tr><td style="text-align:left;"><code>%cn</code></td> <td style="text-align:left;">提交者的名字</td></tr> <tr><td style="text-align:left;"><code>%ce</code></td> <td style="text-align:left;">提交者的电子邮件地址</td></tr> <tr><td style="text-align:left;"><code>%cd</code></td> <td style="text-align:left;">提交日期</td></tr> <tr><td style="text-align:left;"><code>%cr</code></td> <td style="text-align:left;">提交日期（距今多长时间）</td></tr> <tr><td style="text-align:left;"><code>%s</code></td> <td style="text-align:left;">提交说明</td></tr></tbody></table> <p><code>git log</code> 的常用选项。</p> <table><thead><tr><th style="text-align:left;">选项</th> <th style="text-align:left;">说明</th></tr></thead> <tbody><tr><td style="text-align:left;"><code>-p</code></td> <td style="text-align:left;">按补丁格式显示每个提交引入的差异。</td></tr> <tr><td style="text-align:left;"><code>--stat</code></td> <td style="text-align:left;">显示每次提交的文件修改统计信息。</td></tr> <tr><td style="text-align:left;"><code>--shortstat</code></td> <td style="text-align:left;">只显示 --stat 中最后的行数修改添加移除统计。</td></tr> <tr><td style="text-align:left;"><code>--name-only</code></td> <td style="text-align:left;">仅在提交信息后显示已修改的文件清单。</td></tr> <tr><td style="text-align:left;"><code>--name-status</code></td> <td style="text-align:left;">显示新增、修改、删除的文件清单。</td></tr> <tr><td style="text-align:left;"><code>--abbrev-commit</code></td> <td style="text-align:left;">仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。</td></tr> <tr><td style="text-align:left;"><code>--relative-date</code></td> <td style="text-align:left;">使用较短的相对时间而不是完整格式显示日期（比如“2 weeks ago”）。</td></tr> <tr><td style="text-align:left;"><code>--graph</code></td> <td style="text-align:left;">在日志旁以 ASCII 图形显示分支与合并历史。</td></tr> <tr><td style="text-align:left;"><code>--pretty</code></td> <td style="text-align:left;">使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format（用来定义自己的格式）。</td></tr> <tr><td style="text-align:left;"><code>--oneline</code></td> <td style="text-align:left;"><code>--pretty=oneline --abbrev-commit</code> 合用的简写。</td></tr></tbody></table> <h3 id="撤消操作"><a href="#撤消操作" class="header-anchor">#</a> 撤消操作</h3> <p>在任何一个阶段，你都有可能想要撤消某些操作。 这里，我们将会学习几个撤消你所做修改的基本工具。注意，有些撤消操作是不可逆的。 这是在使用 Git 的过程中，会因为操作失误而导致之前的工作丢失的少有的几个地方之一。</p> <p>有时候我们提交完了才发现漏掉了几个文件没有添加，或者提交信息写错了。 此时，可以运行带有 <code>--amend</code> 选项的提交命令来重新提交：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> commit --amend
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改（例如，在上次提交后马上执行了此命令）， 那么快照会保持不变，而你所修改的只是提交信息。也就是说本次提交覆盖上一次提交。</p> <h4 id="取消暂存的文件"><a href="#取消暂存的文件" class="header-anchor">#</a> 取消暂存的文件</h4> <p>例如，你已经修改了两个文件并且想要将它们作为两次独立的修改提交， 但是却意外地输入 <code>git add *</code> 暂存了它们两个。如何只取消暂存两个中的一个呢？ <code>git status</code> 命令提示了你：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> <span class="token function">add</span> *
$ <span class="token function">git</span> status
On branch master
Changes to be committed:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git reset HEAD &lt;file&gt;...&quot;</span> to unstage<span class="token punctuation">)</span>

    renamed:    README.md -<span class="token operator">&gt;</span> README
    modified:   CONTRIBUTING.md
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>在 “Changes to be committed” 文字正下方，提示使用 <code>git reset HEAD &lt;file&gt;...</code> 来取消暂存。 所以，我们可以这样来取消暂存 <code>CONTRIBUTING.md</code> 文件：</p> <div class="language-console line-numbers-mode"><pre class="language-text"><code>$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M	CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use &quot;git reset HEAD &lt;file&gt;...&quot; to unstage)

    renamed:    README.md -&gt; README

Changes not staged for commit:
  (use &quot;git add &lt;file&gt;...&quot; to update what will be committed)
  (use &quot;git checkout -- &lt;file&gt;...&quot; to discard changes in working directory)

    modified:   CONTRIBUTING.md
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><p>这个命令有点儿奇怪，但是起作用了。 <code>CONTRIBUTING.md</code> 文件已经是修改未暂存的状态了。</p> <h4 id="撤消对文件的修改"><a href="#撤消对文件的修改" class="header-anchor">#</a> 撤消对文件的修改</h4> <p>如果你并不想保留对 <code>CONTRIBUTING.md</code> 文件的修改怎么办？ 你该如何方便地撤消修改——将它还原成上次提交时的样子（或者刚克隆完的样子，或者刚把它放入工作目录时的样子）？ 幸运的是，<code>git status</code> 也告诉了你应该如何做。 在最后一个例子中，未暂存区域是这样：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> status
Changes not staged <span class="token keyword">for</span> commit:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git add &lt;file&gt;...&quot;</span> to update what will be committed<span class="token punctuation">)</span>
  <span class="token punctuation">(</span>use <span class="token string">&quot;git checkout -- &lt;file&gt;...&quot;</span> to discard changes <span class="token keyword">in</span> working directory<span class="token punctuation">)</span>

    modified:   CONTRIBUTING.md
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>它非常清楚地告诉了你如何撤消之前所做的修改。 让我们来按照提示执行：</p> <div class="language-console line-numbers-mode"><pre class="language-text"><code>$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use &quot;git reset HEAD &lt;file&gt;...&quot; to unstage)

    renamed:    README.md -&gt; README
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>可以看到那些修改已经被撤消了。</p> <h3 id="远程仓库的使用"><a href="#远程仓库的使用" class="header-anchor">#</a> 远程仓库的使用</h3> <p>为了能在任意 Git 项目上协作，你需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库，通常有些仓库对你只读，有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。</p> <h4 id="查看远程仓库"><a href="#查看远程仓库" class="header-anchor">#</a> 查看远程仓库</h4> <p>如果想查看你已经配置的远程仓库服务器，可以运行 <code>git remote</code> 命令。 它会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库，那么至少应该能看到 origin ——这是 Git 给你克隆的仓库服务器的默认名字：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> remote
origin
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>你也可以指定选项 <code>-v</code>，会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token punctuation">[</span>root@gitlab code6<span class="token punctuation">]</span><span class="token comment"># git remote -v</span>
origin	git@github.com:yangyang0910/code6.git <span class="token punctuation">(</span>fetch<span class="token punctuation">)</span>
origin	git@github.com:yangyang0910/code6.git <span class="token punctuation">(</span>push<span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h4 id="添加远程仓库"><a href="#添加远程仓库" class="header-anchor">#</a> 添加远程仓库</h4> <p>我们在之前的章节中已经提到并展示了 <code>git clone</code> 命令是自行添加远程仓库的， 不过如果是自己创建的仓库就需要自己添加远程仓库。运行 <code>git remote add &lt;shortname&gt; &lt;url&gt;</code> 添加一个新的远程 Git 仓库，同时指定一个方便使用的简写：</p> <div class="language-console line-numbers-mode"><pre class="language-text"><code>$ git remote
origin
$ git remote add pb https://github.com/yangyang0910/devops
$ git remote -v
origin	git@github.com:yangyang0910/code6.git (fetch)
origin	git@github.com:yangyang0910/code6.git (push)
pb	https://github.com/yangyang0910/devops (fetch)
pb	https://github.com/yangyang0910/devops (push)
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>现在你可以在命令行中使用字符串 <code>pb</code> 来代替整个 URL。 例如，如果你想拉取 devops 的仓库中有但你没有的信息，可以运行 <code>git fetch pb</code>：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> fetch pb
remote: Counting objects: <span class="token number">43</span>, done.
remote: Compressing objects: <span class="token number">100</span>% <span class="token punctuation">(</span><span class="token number">36</span>/36<span class="token punctuation">)</span>, done.
remote: Total <span class="token number">43</span> <span class="token punctuation">(</span>delta <span class="token number">10</span><span class="token punctuation">)</span>, reused <span class="token number">31</span> <span class="token punctuation">(</span>delta <span class="token number">5</span><span class="token punctuation">)</span>
Unpacking objects: <span class="token number">100</span>% <span class="token punctuation">(</span><span class="token number">43</span>/43<span class="token punctuation">)</span>, done.
From https://github.com/yangyang0910/devops
 * <span class="token punctuation">[</span>new branch<span class="token punctuation">]</span>      master     -<span class="token operator">&gt;</span> pb/master
 * <span class="token punctuation">[</span>new branch<span class="token punctuation">]</span>      ticgit     -<span class="token operator">&gt;</span> pb/devops
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><h4 id="从远程仓库中抓取与拉取"><a href="#从远程仓库中抓取与拉取" class="header-anchor">#</a> 从远程仓库中抓取与拉取</h4> <p>就如刚才所见，从远程仓库中获得数据，可以执行：</p> <div class="language-console line-numbers-mode"><pre class="language-text"><code>$ git fetch &lt;remote&gt;
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>这个命令会访问远程仓库，从中拉取所有你还没有的数据。 执行完成后，你将会拥有那个远程仓库中所有分支的引用，可以随时合并或查看。</p> <p>如果你使用 <code>clone</code> 命令克隆了一个仓库，命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以，<code>git fetch origin</code> 会抓取克隆（或上一次抓取）后新推送的所有工作。 必须注意 <code>git fetch</code> 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。</p> <h4 id="推送到远程仓库"><a href="#推送到远程仓库" class="header-anchor">#</a> 推送到远程仓库</h4> <p>当你想分享你的项目时，必须将其推送到上游。 这个命令很简单：<code>git push &lt;remote&gt; &lt;branch&gt;</code>。 当你想要将 <code>master</code> 分支推送到 <code>origin</code> 服务器时（再次说明，克隆时通常会自动帮你设置好那两个名字）， 那么运行这个命令就可以将你所做的备份到服务器：</p> <div class="language-console line-numbers-mode"><pre class="language-text"><code>$ git push origin master
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>只有当你有所克隆服务器的写入权限，并且之前没有人推送过时，这条命令才能生效。 当你和其他人在同一时间克隆，他们先推送到上游然后你再推送到上游，你的推送就会毫无疑问地被拒绝。 你必须先抓取他们的工作并将其合并进你的工作后才能推送。</p> <h4 id="查看某个远程仓库"><a href="#查看某个远程仓库" class="header-anchor">#</a> 查看某个远程仓库</h4> <p>如果想要查看某一个远程仓库的更多信息，可以使用 <code>git remote show &lt;remote&gt;</code> 命令。 如果想以一个特定的缩写名运行这个命令，例如 <code>origin</code>，会得到像下面类似的信息：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token punctuation">[</span>root@gitlab code6<span class="token punctuation">]</span><span class="token comment"># git remote show origin</span>
* remote origin
  Fetch URL: git@github.com:yangyang0910/code6.git
  Push  URL: git@github.com:yangyang0910/code6.git
  HEAD branch: master
  Remote branches:
    develop tracked
    master  tracked
  Local branch configured <span class="token keyword">for</span> <span class="token string">'git pull'</span><span class="token builtin class-name">:</span>
    master merges with remote master
  Local ref configured <span class="token keyword">for</span> <span class="token string">'git push'</span><span class="token builtin class-name">:</span>
    master pushes to master <span class="token punctuation">(</span>up to <span class="token function">date</span><span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>它同样会列出远程仓库的 URL 与跟踪分支的信息。 这些信息非常有用，它告诉你正处于 <code>master</code> 分支，并且如果运行 <code>git pull</code>， 就会抓取所有的远程引用，然后将远程 <code>master</code> 分支合并到本地 <code>master</code> 分支。 它也会列出拉取到的所有远程引用。</p> <h4 id="远程仓库的重命名与移除"><a href="#远程仓库的重命名与移除" class="header-anchor">#</a> 远程仓库的重命名与移除</h4> <p>你可以运行 <code>git remote rename</code> 来修改一个远程仓库的简写名。 例如，想要将 <code>pb</code> 重命名为 <code>devops</code>，可以用 <code>git remote rename</code> 这样做：</p> <div class="language-console line-numbers-mode"><pre class="language-text"><code>$ git remote rename pb devops
$ git remote
origin
devops
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>值得注意的是这同样也会修改你所有远程跟踪的分支名字。 那些过去引用 <code>pb/master</code> 的现在会引用 <code>devops/master</code>。</p> <p>如果因为一些原因想要移除一个远程仓库——你已经从服务器上搬走了或不再想使用某一个特定的镜像了， 又或者某一个贡献者不再贡献了——可以使用 <code>git remote remove</code> 或 <code>git remote rm</code> ：</p> <div class="language-console line-numbers-mode"><pre class="language-text"><code>$ git remote remove devops
$ git remote
origin
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>一旦你使用这种方式删除了一个远程仓库，那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。</p> <h3 id="打标签"><a href="#打标签" class="header-anchor">#</a> 打标签</h3> <p>Git 可以给仓库历史中的某一个提交打上标签，以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点（ <code>v1.0</code> 、 <code>v2.0</code> 等等）。</p> <h4 id="列出标签"><a href="#列出标签" class="header-anchor">#</a> 列出标签</h4> <p>在 Git 中列出已有的标签非常简单，只需要输入 <code>git tag</code> （可带上可选的 <code>-l</code> 选项 <code>--list</code>）：</p> <div class="language-console line-numbers-mode"><pre class="language-text"><code>$ git tag
v1.0
v2.0
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>这个命令以字母顺序列出标签，但是它们显示的顺序并不重要。</p> <p>你也可以按照特定的模式查找标签。 例如，Git 自身的源代码仓库包含标签的数量超过 500 个。 如果只对 1.8.5 系列感兴趣，可以运行：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> tag -l <span class="token string">&quot;v1.8.5*&quot;</span>
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h4 id="创建标签"><a href="#创建标签" class="header-anchor">#</a> 创建标签</h4> <p>Git 支持两种标签：轻量标签（lightweight）与附注标签（annotated）。</p> <p>轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。</p> <p>而附注标签是存储在 Git 数据库中的一个完整对象， 它们是可以被校验的，其中包含打标签者的名字、电子邮件地址、日期时间， 此外还有一个标签信息，并且可以使用 GNU Privacy Guard （GPG）签名并验证。 通常会建议创建附注标签，这样你可以拥有以上所有信息。但是如果你只是想用一个临时的标签， 或者因为某些原因不想要保存这些信息，那么也可以用轻量标签。</p> <h4 id="附注标签"><a href="#附注标签" class="header-anchor">#</a> 附注标签</h4> <p>在 Git 中创建附注标签十分简单。 最简单的方式是当你在运行 <code>tag</code> 命令时指定 <code>-a</code> 选项：</p> <div class="language-console line-numbers-mode"><pre class="language-text"><code>$ git tag -a v1.4 -m &quot;my version 1.4&quot;
$ git tag
v0.1
v1.3
v1.4
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p><code>-m</code> 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息，Git 会启动编辑器要求你输入信息。</p> <p>通过使用 <code>git show</code> 命令可以看到标签信息和与之对应的提交信息：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token punctuation">[</span>root@gitlab code6<span class="token punctuation">]</span><span class="token comment"># git show 1.5.6</span>
commit f485a996b1b7d9cd925bc629ce7f8b75082e45db
Merge: 42f93a6 eac86fc
Author: YoonPer <span class="token operator">&lt;</span>cccccccccc@qq.com<span class="token operator">&gt;</span>
Date:   Fri Oct <span class="token number">29</span> <span class="token number">16</span>:50:38 <span class="token number">2021</span> +0800

    Merge pull request <span class="token comment">#172 from 4x99/develop</span>
    
    v1.5.6
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>输出显示了打标签者的信息、打标签的日期时间、附注信息，然后显示具体的提交信息。</p> <h4 id="轻量标签"><a href="#轻量标签" class="header-anchor">#</a> 轻量标签</h4> <p>另一种给提交打标签的方式是使用轻量标签。 轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签，不需要使用 <code>-a</code>、<code>-s</code> 或 <code>-m</code> 选项，只需要提供标签名字：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> tag v1.4-lw
$ <span class="token function">git</span> tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>这时，如果在标签上运行 <code>git show</code>，你不会看到额外的标签信息。 命令只会显示出提交信息：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> show v1.4-lw
commit ebee69797eefeebeb2e075cee4f1cbe766e52d87
Author: YoonPer <span class="token operator">&lt;</span>yoonper@qq.com<span class="token operator">&gt;</span>
Date:   Wed Jun <span class="token number">15</span> <span class="token number">16</span>:10:23 <span class="token number">2022</span> +0800

    其他：version <span class="token number">1.6</span>.0

<span class="token function">diff</span> --git a/version b/version
index f01291b<span class="token punctuation">..</span>dc1e644 <span class="token number">100644</span>
--- a/version
+++ b/version
@@ -1 +1 @@
-1.5.7
+1.6.0
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><h2 id="git分支"><a href="#git分支" class="header-anchor">#</a> Git分支</h2> <p>假设现在，Git 仓库中有五个对象：三个 <em>blob</em> 对象（保存着文件快照）、一个 <strong>树</strong> 对象 （记录着目录结构和 blob 对象索引）以及一个 <strong>提交</strong> 对象（包含着指向前述树对象的指针和所有提交信息）。</p> <p><img src="https://git-scm.com/book/en/v2/images/commit-and-tree.png" alt="首次提交对象及其树结构。"></p> <p>Git 的分支，其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 <code>master</code>。 在多次提交操作之后，你其实已经有一个指向最后那个提交对象的 <code>master</code> 分支。 <code>master</code> 分支会在每次提交时自动向前移动。</p> <p><img src="/img/branch-and-history.png" alt="分支及其提交历史。"></p> <p>那么，Git 又是怎么知道当前在哪一个分支上呢？ 也很简单，它有一个名为 <code>HEAD</code> 的特殊指针。 请注意它和许多其它版本控制系统（如 Subversion 或 CVS）里的 <code>HEAD</code> 概念完全不同。 在 Git 中，它是一个指针，指向当前所在的本地分支（译注：将 <code>HEAD</code> 想象为当前分支的别名）。</p> <h3 id="分支创建"><a href="#分支创建" class="header-anchor">#</a> 分支创建</h3> <p>Git 是怎么创建新分支的呢？ 很简单，它只是为你创建了一个可以移动的新的指针。 比如，创建一个 testing 分支， 你需要使用 <code>git branch</code> 命令：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> branch testing
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>这会在当前所在的提交对象上创建一个指针。</p> <p>你可以简单地使用 <code>git log</code> 命令查看各个分支当前所指的对象。 提供这一功能的参数是 <code>--decorate</code>。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> branch <span class="token builtin class-name">test</span>
$ <span class="token function">git</span> log --oneline --decorate
ebee697 <span class="token punctuation">(</span>HEAD, tag: v1.4-lw, tag: <span class="token number">1.6</span>.0, origin/master, origin/HEAD, test, master<span class="token punctuation">)</span> 其他：version <span class="token number">1.6</span>.0
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>正如你所见，当前 <code>master</code> 和 <code>test</code> 分支均指向校验和以 <code>f30ab</code> 开头的提交对象。</p> <h3 id="分支切换"><a href="#分支切换" class="header-anchor">#</a> 分支切换</h3> <p>要切换到一个已存在的分支，你需要使用 <code>git checkout</code> 命令。 我们现在切换到新创建的 <code>test</code> 分支去：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> checkout <span class="token builtin class-name">test</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>这样 <code>HEAD</code> 就指向 <code>test</code> 分支了。</p> <p><img src="/img/head-to-testing.png" alt="HEAD 指向当前所在的分支。"></p> <p>那么，这样的实现方式会给我们带来什么好处呢？ 现在不妨再提交一次：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">vim</span> test.rb
$ <span class="token function">git</span> commit -a -m <span class="token string">'made a change'</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p><img src="/img/advance-testing.png" alt="HEAD 分支随着提交操作自动向前移动。"></p> <p>如图所示，你的 <code>test</code> 分支向前移动了，但是 <code>master</code> 分支却没有，它仍然指向运行 <code>git checkout</code> 时所指的对象。 这就有意思了，现在我们切换回 <code>master</code> 分支看看：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> checkout master
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p><img src="/img/checkout-master.png" alt="检出时 HEAD 随之移动。"></p> <p>这条命令做了两件事。 一是使 HEAD 指回 <code>master</code> 分支，二是将工作目录恢复成 <code>master</code> 分支所指向的快照内容。 也就是说，你现在做修改的话，项目将始于一个较旧的版本。 本质上来讲，这就是忽略 <code>test</code> 分支所做的修改，以便于向另一个方向进行开发。</p> <p>我们不妨再稍微做些修改并提交：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">vim</span> test.rb
$ <span class="token function">git</span> commit -a -m <span class="token string">'made other changes'</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>现在，这个项目的提交历史已经产生了分叉。 因为刚才你创建了一个新分支，并切换过去进行了一些工作，随后又切换回 master 分支进行了另外一些工作。 上述两次改动针对的是不同分支：你可以在不同分支间不断地来回切换和工作，并在时机成熟时将它们合并起来。 而所有这些工作，你需要的命令只有 <code>branch</code>、<code>checkout</code> 和 <code>commit</code>。</p> <p><img src="/img/advance-master.png" alt="项目分叉历史。"></p> <p>你可以简单地使用 <code>git log</code> 命令查看分叉历史。 运行 <code>git log --oneline --decorate --graph --all</code> ，它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> log --oneline --decorate --graph --all
* c2b9e <span class="token punctuation">(</span>HEAD, master<span class="token punctuation">)</span> made other changes
<span class="token operator">|</span> * 87ab2 <span class="token punctuation">(</span>test<span class="token punctuation">)</span> made a change
<span class="token operator">|</span>/
* f30ab <span class="token function">add</span> feature <span class="token comment">#32 - ability to add new formats to the</span>
* 34ac2 fixed bug <span class="token comment">#1328 - stack overflow under certain conditions</span>
* 98ca9 initial commit of my project
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h3 id="分支的新建与合并"><a href="#分支的新建与合并" class="header-anchor">#</a> 分支的新建与合并</h3> <p>首先，我们假设你正在你的项目上工作，并且在 <code>master</code> 分支上已经有了一些提交。</p> <p><img src="/img/basic-branching-1.png" alt="一个简单的提交历史。"></p> <p>现在，你已经决定要解决你的公司使用的问题追踪系统中的 #53 问题。 想要新建一个分支并同时切换到那个分支上，你可以运行一个带有 <code>-b</code> 参数的 <code>git checkout</code> 命令：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> checkout -b iss53
Switched to a new branch <span class="token string">&quot;iss53&quot;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>它是下面两条命令的简写：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> branch iss53
$ <span class="token function">git</span> checkout iss53
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p><img src="/img/basic-branching-2.png" alt="创建一个新分支指针。"></p> <p>接下来，你要修复这个紧急问题。 我们来建立一个 <code>hotfix</code> 分支，在该分支上工作直到问题解决：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> checkout -b hotfix
Switched to a new branch <span class="token string">'hotfix'</span>
$ <span class="token function">vim</span> index.html
$ <span class="token function">git</span> commit -a -m <span class="token string">'fixed the broken email address'</span>
<span class="token punctuation">[</span>hotfix 1fb7853<span class="token punctuation">]</span> fixed the broken email address
 <span class="token number">1</span> <span class="token function">file</span> changed, <span class="token number">2</span> insertions<span class="token punctuation">(</span>+<span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p><img src="/img/basic-branching-4.png" alt="基于  分支的紧急问题分支（hotfix branch）。"></p> <p>你可以运行你的测试，确保你的修改是正确的，然后将 <code>hotfix</code> 分支合并回你的 <code>master</code> 分支来部署到线上。 你可以使用 <code>git merge</code> 命令来达到上述目的：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> checkout master
$ <span class="token function">git</span> merge hotfix
Updating f42c576<span class="token punctuation">..</span>3a0874c
Fast-forward
 index.html <span class="token operator">|</span> <span class="token number">2</span> ++
 <span class="token number">1</span> <span class="token function">file</span> changed, <span class="token number">2</span> insertions<span class="token punctuation">(</span>+<span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>现在，最新的修改已经在 <code>master</code> 分支所指向的提交快照中，你可以着手发布该修复了。</p> <p><img src="/img/basic-branching-5.png" alt=" 被快进到 。"></p> <p>关于这个紧急问题的解决方案发布之后，你准备回到被打断之前时的工作中。 然而，你应该先删除 <code>hotfix</code> 分支，因为你已经不再需要它了 —— <code>master</code> 分支已经指向了同一个位置。 你可以使用带 <code>-d</code> 选项的 <code>git branch</code> 命令来删除分支：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> branch -d hotfix
Deleted branch hotfix <span class="token punctuation">(</span>3a0874c<span class="token punctuation">)</span>.
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>现在你可以切换回你正在工作的分支继续你的工作，也就是针对 #53 问题的那个分支（iss53 分支）。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> checkout iss53
Switched to branch <span class="token string">&quot;iss53&quot;</span>
$ <span class="token function">vim</span> index.html
$ <span class="token function">git</span> commit -a -m <span class="token string">'finished the new footer [issue 53]'</span>
<span class="token punctuation">[</span>iss53 ad82d7a<span class="token punctuation">]</span> finished the new footer <span class="token punctuation">[</span>issue <span class="token number">53</span><span class="token punctuation">]</span>
<span class="token number">1</span> <span class="token function">file</span> changed, <span class="token number">1</span> insertion<span class="token punctuation">(</span>+<span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p><img src="/img/basic-branching-6.png" alt="继续在  分支上的工作。"></p> <h3 id="遇到冲突时的分支合并"><a href="#遇到冲突时的分支合并" class="header-anchor">#</a> 遇到冲突时的分支合并</h3> <p>有时候合并操作不会如此顺利。 如果你在两个不同的分支中，对同一个文件的同一个部分进行了不同的修改，Git 就没法干净的合并它们。 如果你对 #53 问题的修改和有关 <code>hotfix</code> 分支的修改都涉及到同一个文件的同一处，在合并它们的时候就会产生合并冲突：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> merge iss53
Auto-merging index.html
CONFLICT <span class="token punctuation">(</span>content<span class="token punctuation">)</span>: Merge conflict <span class="token keyword">in</span> index.html
Automatic merge failed<span class="token punctuation">;</span> fix conflicts and <span class="token keyword">then</span> commit the result.
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>此时 Git 做了合并，但是没有自动地创建一个新的合并提交。 Git 会暂停下来，等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用 <code>git status</code> 命令来查看那些因包含合并冲突而处于未合并（unmerged）状态的文件：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> status
On branch master
You have unmerged paths.
  <span class="token punctuation">(</span>fix conflicts and run <span class="token string">&quot;git commit&quot;</span><span class="token punctuation">)</span>

Unmerged paths:
  <span class="token punctuation">(</span>use <span class="token string">&quot;git add &lt;file&gt;...&quot;</span> to mark resolution<span class="token punctuation">)</span>

    both modified:      index.html

no changes added to commit <span class="token punctuation">(</span>use <span class="token string">&quot;git add&quot;</span> and/or <span class="token string">&quot;git commit -a&quot;</span><span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h3 id="远程分支"><a href="#远程分支" class="header-anchor">#</a> 远程分支</h3> <p>远程引用是对远程仓库的引用（指针），包括分支、标签等等。</p> <h4 id="获取远程分支"><a href="#获取远程分支" class="header-anchor">#</a> 获取远程分支</h4> <p>现在已经创建、合并、删除了一些分支，让我们看看一些常用的分支管理工具。</p> <p><code>git branch</code> 命令不只是可以创建与删除分支。 如果不加任何参数运行它，会得到当前所有分支的一个列表：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> branch
  iss53
* master
  testing
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><h4 id="推送"><a href="#推送" class="header-anchor">#</a> 推送</h4> <p>当你想要公开分享一个分支时，需要将其推送到有写入权限的远程仓库上。 本地的分支并不会自动与远程仓库同步——你必须显式地推送想要分享的分支。 这样，你就可以把不愿意分享的内容放到私人分支上，而将需要和别人协作的内容推送到公开分支。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> push origin iss53
Counting objects: <span class="token number">24</span>, done.
Delta compression using up to <span class="token number">8</span> threads.
Compressing objects: <span class="token number">100</span>% <span class="token punctuation">(</span><span class="token number">15</span>/15<span class="token punctuation">)</span>, done.
Writing objects: <span class="token number">100</span>% <span class="token punctuation">(</span><span class="token number">24</span>/24<span class="token punctuation">)</span>, <span class="token number">1.91</span> KiB <span class="token operator">|</span> <span class="token number">0</span> bytes/s, done.
Total <span class="token number">24</span> <span class="token punctuation">(</span>delta <span class="token number">2</span><span class="token punctuation">)</span>, reused <span class="token number">0</span> <span class="token punctuation">(</span>delta <span class="token number">0</span><span class="token punctuation">)</span>
To git@github.com:yangyang0910/code6.git
 * <span class="token punctuation">[</span>new branch<span class="token punctuation">]</span>      serverfix -<span class="token operator">&gt;</span> serverfix
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><h4 id="删除远程分支"><a href="#删除远程分支" class="header-anchor">#</a> 删除远程分支</h4> <p>假设你已经通过远程分支做完所有的工作了——也就是说你和你的协作者已经完成了一个特性， 并且将其合并到了远程仓库的 <code>master</code> 分支（或任何其他稳定代码分支）。 可以运行带有 <code>--delete</code> 选项的 <code>git push</code> 命令来删除一个远程分支。 如果想要从服务器上删除 <code>serverfix</code> 分支，运行下面的命令：</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> push origin --delete iss53
To git@github.com:yangyang0910/code6.git
 - <span class="token punctuation">[</span>deleted<span class="token punctuation">]</span>         iss53
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>基本上这个命令做的只是从服务器上移除这个指针。 Git 服务器通常会保留数据一段时间直到垃圾回收运行，所以如果不小心删除掉了，通常是很容易恢复的。</p></div></div>  <div class="page-edit"><div class="edit-link"><a href="https://github.com//edit/master/docs/05.DevOps/01.git/01.Git.md" target="_blank" rel="noopener noreferrer">编辑</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----> <div class="last-updated"><span class="prefix">上次更新:</span> <span class="time">2022/06/24, 12:24:14</span></div></div> <div class="page-nav-wapper"><div class="page-nav-centre-wrap"><!----> <a href="/pages/fb2fff/" class="page-nav-centre page-nav-centre-next"><div class="tooltip">02、GitLab</div></a></div> <div class="page-nav"><p class="inner"><!----> <span class="next"><a href="/pages/fb2fff/">02、GitLab</a>→
      </span></p></div></div></div> <div class="article-list"><div class="article-title"><a href="/archives/" class="iconfont icon-bi">最近更新</a></div> <div class="article-wrapper"><dl><dd>01</dd> <dt><a href="/pages/894626/"><div>
            企业级流水线的两种部署场景
            <!----></div></a> <span class="date">06-23</span></dt></dl><dl><dd>02</dd> <dt><a href="/pages/bc4b74/"><div>
            Jenkins集成各种工具
            <!----></div></a> <span class="date">06-23</span></dt></dl><dl><dd>03</dd> <dt><a href="/pages/c6f51e/"><div>
            Jenkins流水线语法
            <!----></div></a> <span class="date">06-23</span></dt></dl> <dl><dd></dd> <dt><a href="/archives/" class="more">更多文章&gt;</a></dt></dl></div></div></main></div> <div class="footer"><div class="icons"><a href="mailto:chenyangqit@163.com" title="发邮件" target="_blank" class="iconfont icon-youjian"></a><a href="https://juejin.cn/user/730513894553032/course" title="掘金" target="_blank" class="iconfont icon-juejin"></a><a href="/img/weixin.jpg" title="微信" target="_blank" class="iconfont icon-weixin"></a><a href="https://music.163.com/#/playlist?id=755597173" title="听音乐" target="_blank" class="iconfont icon-erji"></a></div> 
  Theme by
  <a href="https://github.com/xugaoyi/vuepress-theme-vdoing" target="_blank" title="本站主题">Vdoing</a> 
    | Copyright © 2019-2022
    <span>小阳爱技术 | <a href="https://blog.abck8s.com" target="_blank">MIT License</a></span></div> <div class="buttons"><div title="返回顶部" class="button blur go-to-top iconfont icon-fanhuidingbu" style="display:none;"></div> <div title="去评论" class="button blur go-to-comment iconfont icon-pinglun" style="display:none;"></div> <div title="主题模式" class="button blur theme-mode-but iconfont icon-zhuti"><ul class="select-box" style="display:none;"><li class="iconfont icon-zidong">
          跟随系统
        </li><li class="iconfont icon-rijianmoshi">
          浅色模式
        </li><li class="iconfont icon-yejianmoshi">
          深色模式
        </li><li class="iconfont icon-yuedu">
          阅读模式
        </li></ul></div></div> <!----> <!----> <!----></div><div class="global-ui"><div></div></div></div>
    <script src="/assets/js/app.9f33dad1.js" defer></script><script src="/assets/js/2.336839c5.js" defer></script><script src="/assets/js/25.7b40ded3.js" defer></script>
  </body>
</html>
